from django.db import models

# Create your models here.


class InterfaceList(models.Model):
    """
        接口清单
    """
    product = models.ForeignKey('product.Product', verbose_name='所属产品', on_delete=models.CASCADE,
                                null=True)  # 关联产品id
    interface_name = models.CharField('接口名称', max_length=100)  # 接口名称描述
    interface_desc = models.CharField('描述', max_length=64, blank=True, null=True)  # 接口描述
    interface_url = models.CharField('url地址', max_length=200)  # 请求的路径，不含域名或者IP端口号
    interface_header = models.CharField('请求头', max_length=800,default="{'Authorization': '', 'Content-Type': 'application/json'}")  # 请求头信息，设置时用字典方式
    REQUEST_METHOD = (('get', 'get'), ('post', 'post'),
                      ('put', 'put'), ('delete', 'delete'), ('patch', 'patch'))
    REQUEST_BODY_FORM = (('No body', 'No body'), ('JSON', 'JSON'), ('XML', 'XML'),
                         ('x-www-form-urlencoded', 'x-www-form-urlencoded'),
                         ('Binary file', 'Binary file'), ('form-data', 'form-data'), ('Text', 'Text'))
    REQUEST_PROTOCOL = (('http', 'http'), ('https', 'https'))
    interface_protocol = models.CharField(verbose_name='接口协议', choices=REQUEST_PROTOCOL,
                                          default='http', max_length=50,
                                          null=True)
    interface_method = models.CharField(verbose_name='请求方法', choices=REQUEST_METHOD,
                                        default='get', max_length=200,
                                        null=True)  # 请求方法
    interface_body_form = models.CharField(verbose_name='请求体格式', choices=REQUEST_BODY_FORM,
                                           default='JSON', max_length=200,
                                           null=True)  # 请求方法
    interface_modifier = models.CharField('最后修改人', max_length=16)  # 最后修改人
    interface_mtime = models.DateTimeField('最后修改时间', auto_now=True)  # 最后修改时间-自动获取当前时间
    interface_creator = models.CharField('创建者', max_length=16)  # 创建者
    interface_ctime = models.DateTimeField('创建时间', auto_now_add=True)  # 创建时间-自动获取当前时间
    on_detele = models.BooleanField(default=False)

    class Meta:
        verbose_name = '接口'
        verbose_name_plural = '接口列表'

    def __str__(self):
        return self.interface_name


class InterfaceTestCase(models.Model):
    """
        测试用例
    """
    interface = models.ForeignKey(
        'InterfaceList', verbose_name='接口名称', on_delete=models.DO_NOTHING, null=True)  # 关联接口id
    case_name = models.CharField('用例标题', max_length=100)  # 用例标题
    case_desc = models.CharField('描述', max_length=64, blank=True, null=True)  # 用例描述
    case_data = models.TextField('请求内容', max_length=800, blank=True, null=True)  # 请求体内容，根据对应的格式设置
    case_expected = models.TextField('预期结果', max_length=50000, blank=True, null=True)  # 预期结果
    case_response = models.TextField('实际结果', max_length=50000, blank=True, null=True)  # 响应数据
    case_modifier = models.CharField('测试执行人', max_length=16)  # 如果是定时任务执行记录为sys
    case_mtime = models.DateTimeField('最后修改时间', auto_now=True)  # 最后修改时间-自动获取当前时间
    case_creator = models.CharField('创建者', max_length=16)  # 创建者
    case_ctime = models.DateTimeField('创建时间', auto_now_add=True)  # 创建时间-自动获取当前时间
    on_detele = models.BooleanField(default=False)


    class Meta:
        verbose_name = '测试用例'
        verbose_name_plural = '测试用例'

    def __str__(self):
        return self.case_name


class InterfaceTestSuite(models.Model):
    """
        测试集
    """
    suite_name = models.CharField('测试集名称', max_length=64)  # 测试集名称
    suite_desc = models.CharField('描述', max_length=64, blank=True, null=True)  # 测试集描述
    suite_host_name = models.CharField('域名/IP:端口号', max_length=200, default='127.0.0.1')  # 请求的域名或者IP含端口号
    suite_result = models.BooleanField('测试结果')  # 测试集测试结果
    suite_status = models.BooleanField('是否有效', default=True)  # 根据该字段确认是否执行该用例集
    suite_modifier = models.CharField('测试执行人', max_length=16)  # 如果是定时任务执行记录为sys
    suite_mtime = models.DateTimeField('最后修改时间', auto_now=True)  # 最后修改-自动获取当前时间
    suite_creator = models.CharField('创建者', max_length=16)  # 测试集创建者
    suite_create_time = models.DateTimeField('创建时间', auto_now_add=True)  # 创建时间-自动获取当前时间
    on_detele = models.BooleanField(default=False)
    suite_case = models.ManyToManyField(verbose_name='测试用例', to=InterfaceTestCase, blank=True, null=True)

    class Meta:
        ordering = ['suite_mtime']
        verbose_name = '测试集'
        verbose_name_plural = '测试集'

    def __str__(self):
        return self.suite_name


class SuitCase(models.Model):
    suite = models.ForeignKey(
        'InterfaceTestSuite', verbose_name='测试集', on_delete=models.DO_NOTHING)  # 关联接口id
    interface_id = models.ForeignKey(
        'InterfaceList', verbose_name='接口', on_delete=models.DO_NOTHING)
    case_id = models.ForeignKey(
        'InterfaceTestCase',verbose_name='用例', on_delete=models.DO_NOTHING)
    run_order = models.IntegerField('执行顺序')
    interface_host_name = models.CharField('域名/IP:端口号', max_length=200, default='127.0.0.1')  # 请求的域名或者IP含端口号
    interface_url = models.CharField('url地址', max_length=200)  # 请求的路径，不含域名或者IP端口号
    interface_header = models.CharField('请求头', max_length=800)  # 请求头信息，设置时用字典方式
    interface_protocol = models.CharField(verbose_name='接口协议', default='http', max_length=50)
    interface_method = models.CharField(verbose_name='请求方法', default='get', max_length=50)  # 请求方法
    interface_body_form = models.CharField(verbose_name='请求体格式', default='JSON', max_length=200)  # 请求方法
    case_desc = models.CharField('用例描述', max_length=64, blank=True, null=True)  # 用例描述
    case_data = models.TextField('请求内容', max_length=800, blank=True, null=True)  # 请求体内容，根据对应的格式设置
    case_expected = models.TextField('预期结果', max_length=200, blank=True, null=True)  # 预期结果
    case_response = models.TextField('实际结果', max_length=5000, blank=True, null=True)  # 响应数据
    run_status = models.BooleanField('是否执行', default=False)  # 是否执行
    run_result = models.BooleanField('执行结果', default=True)  # 测试集测试结果,成功或者失败
    run_owner = models.CharField('测试执行人', max_length=16,default='sys')  # 如果是定时任务执行记录为sys
    run_time = models.DateTimeField('最后修改时间', auto_now=True)  # 最后修改-自动获取当前时间
    run_creator = models.CharField('创建者', max_length=16)  # 创建者
    run_ctime = models.DateTimeField('创建时间', auto_now_add=True)  # 创建时间-自动获取当前时间
    # owner = models.ForeignKey（User，related_name ='game_user'，verbose_name ='Owner'）

    class Meta:
        ordering = ['suite', 'run_order']
        verbose_name = '用例集执行'
        verbose_name_plural = '用例集执行'

    def __str__(self):
        return self.suite.suite_name
